package com.task;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.stream.Collectors;

public class Test {
    // 注意常量定义为静态才能在静态方法中使用
    static final int X = 16;
    // 注意这个N是所有事物共享的次数,需要格外有一个变量存放
    static final int N = 4;
    static final int M = 4;
    static int FOOD_OVER_X_COUNT = 0;

    public static void main(String[] args) {

        // 创建泛型集合：泛型:食物类、Integer包装类

        // 1.集合选择：将吃过食物次数作为值和食物对象形成键值对
        // 2.使用HashMap集合，且需要重写hashCode和equals方法
        HashMap<Food, Integer> foodHashMap = new HashMap<>();

        // 添加食物
        // 1. 创建食物对象
        Food f1 = new Food("牛肉面", 12);
        Food f2 = new Food("塔斯汀", 20);
        Food f3 = new Food("麻辣烫", 18);
        Food f4 = new Food("水饺", 12);
        Food f5 = new Food("烧腊饭", 15);
        Food f6 = new Food("煲仔饭", 14);
        Food f7 = new Food("杀猪粉", 12);
        Food f8 = new Food("寿司", 25);
        Food f9 = new Food("大众餐", 10);
        Food f10 = new Food("肠粉", 8);
        // 2.添加键值对到集合中，值(吃的次数)均为0
        foodHashMap.put(f1, 0);
        foodHashMap.put(f2, 0);
        foodHashMap.put(f3, 0);
        foodHashMap.put(f4, 0);
        foodHashMap.put(f5, 0);
        foodHashMap.put(f6, 0);
        foodHashMap.put(f7, 0);
        foodHashMap.put(f8, 0);
        foodHashMap.put(f9, 0);
        foodHashMap.put(f10, 0);

        // 随机生成今天吃什么：

        // 1.随机数需要有索引
        // 2.只有List系列集合有索引
        // 3.使用stream流将键值对抽取成List集合，List集合中泛型就是键值对
        // 4.双列集合需要先转为单列集合才可以使用stream流
        List<Map.Entry<Food, Integer>> foodlist = foodHashMap
                .entrySet()
                .stream()
                .collect(Collectors.toList());

        // 输出信息处理
        String[] day = {"一", "二", "三", "四", "五", "六", "日"};

        // 进行七次循环得到每天吃什么
        for (String d : day) {
            getFoodList(foodlist, d);
        }

        // 检测规则是否满足
        System.out.println("超过" + X + "元的食物吃了" + FOOD_OVER_X_COUNT + "次");
        for (Map.Entry<Food, Integer> entry : foodlist) {
            System.out.println(entry);
        }
    }

    // 获取每一天的食物清单
    public static void getFoodList(List<Map.Entry<Food, Integer>> foodlist, String day) {
        StringBuilder sb = new StringBuilder("周" + day + ":");
        // 随机出两个食物
        for (int i = 0; i < 2; i++) {
            Food f = getFood(foodlist);
            sb.append(f.getName()).append("\t").append(f.getPrice()).append("元 ");
        }
        System.out.println(sb);
    }

    // 随机出食物
    public static Food getFood(List<Map.Entry<Food, Integer>> foodlist) {
        Random r = new Random();
        while (true) {
            // 获取随机索引
            int index = r.nextInt(foodlist.size());
            // 判断是否符合条件
            // 获取键值对
            Map.Entry<Food, Integer> foodEntry = foodlist.get(index);
            // 获取该食物价格:获取键值对，获取键，获取食物类中的价格
            int price = foodEntry.getKey().getPrice();
            // 获取食物吃过的次数：获取键值对，获取值
            int count = foodEntry.getValue();
            // 判断食物价格
            if (price > X) {
                // 如果满足次数
                // 获取食物对象,将食物对象返回，吃该种超过X元食物的次数+1
                Food f = foodEntry.getKey();
                if (FOOD_OVER_X_COUNT < N) {
                    // 修改键值对对象中的值
                    foodEntry.setValue(++count);
                    // 使用List中的set方法重新更改
                    foodlist.set(index, foodEntry);
                    FOOD_OVER_X_COUNT++;
                    return f;
                }
            } else if (count < M) {
                // 如果价格没有超，就判断吃的次数是否超过M次
                // 修改键值对对象中的值
                foodEntry.setValue(++count);
                // 使用List中的set方法重新更改
                foodlist.set(index, foodEntry);
                return foodEntry.getKey();
            }
        }
    }
}